package com.imooc.coupon.controller;

import com.alibaba.fastjson.JSON;
import com.imooc.coupon.entity.CouponTemplate;
import com.imooc.coupon.exception.CouponException;
import com.imooc.coupon.service.BuildTemplateService;
import com.imooc.coupon.service.TemplateBaseService;
import com.imooc.coupon.support.vo.CouponTemplateSDK;
import com.imooc.coupon.support.vo.TemplateRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 优惠券模板相关功能控制器
 *
 * Created By TINY
 * Create Time 2020/2/10
 **/
@Slf4j
@RestController
public class TemplateController {

    /** 优惠券模板构建服务 */
    private final BuildTemplateService buildTemplateService;

    /** 优惠券模板基础服务 */
    private final TemplateBaseService templateBaseService;

    @Autowired
    public TemplateController(BuildTemplateService buildTemplateService,
                              TemplateBaseService templateBaseService) {
        this.buildTemplateService = buildTemplateService;
        this.templateBaseService = templateBaseService;
    }

    /**
     * 构建优惠券模板
     * 接口地址： 127.0.0.1:7001/coupon-template/template/build
     * 网关转发地址： 127.0.0.1:9000/imooc/coupon-template/template/build
     *
     * @param request {@link TemplateRequest} 模板创建请求对象
     * @return {@link CouponTemplate} 优惠券模板实体
     * @throws CouponException 业务异常对象
     */
    @PostMapping("/template/build")
    public CouponTemplate buildCouponTemplate(
            @RequestBody TemplateRequest request) throws CouponException {

        log.info("构建优惠券模板：{}", JSON.toJSONString(request));

        return buildTemplateService.buildTemplate(request);
    }

    /**
     * 根据 id 构建优惠券模板详情信息
     * 接口地址： 127.0.0.1:7001/coupon-template/template/info?id=1
     * 网关转发地址： 127.0.0.1:9000/imooc/coupon-template/template/info?id=1
     *
     * @return {@link CouponTemplate} 优惠券模板实体
     * @throws CouponException 业务异常对象
     */
    @GetMapping("/template/info")
    public CouponTemplate buildTemplateInfo(
            @RequestParam("id") Integer id) throws CouponException {

        log.info("为 id 为 {} 的优惠券模板构建详情信息", id);

        return templateBaseService.buildTemplateInfo(id);
    }

    /**
     * 查找所有可用的优惠券模板
     * 接口地址： 127.0.0.1:7001/coupon-template/template/sdk/all
     * 网关转发地址： 127.0.0.1:9000/imooc/coupon-template/template/sdk/all
     *
     * @return {@link CouponTemplateSDK} 优惠券模板集合
     */
    @GetMapping("/template/sdk/all")
    public List<CouponTemplateSDK> findAllUsableTemplate() {

        log.info("查找所有可用的优惠券模板");
        return templateBaseService.findAllUsableTemplate();
    }

    /**
     * 获取所有 ids 中对应的CouponTemplateSDK
     * 接口地址： 127.0.0.1:7001/coupon-template/template/sdk/infos
     * 网关转发地址： 127.0.0.1:9000/imooc/coupon-template/template/sdk/infos
     *
     * @param ids 目标优惠券id集合
     * @return 符合条件的优惠券模板
     */
    @GetMapping("/template/sdk/infos")
    public Map<Integer, CouponTemplateSDK> findIds2TemplateSDK(
            @RequestParam("ids") Collection<Integer> ids
    ) {

        log.info("查询 ids -> {} 对应的优惠券模板信息", JSON.toJSONString(ids));
        return templateBaseService.findIds2TemplateSDK(ids);
    }
}
